#Requires AutoHotkey v2.0

#Include "./lib/ocr_Descolada/OCR.ahk"


/**
 * 判断一个字符串中是否出现了数组中含有的关键字
 * @param keywords 关键字数组
 * @param text 待查找文本
 */
HasKeyword(keywords, text) {
    for key in keywords
        if (InStr(text, key))
            return true

    return false
}

/**
 * 返回文本中出现的第一个关键字的位置
 * @param keywords 关键字数组
 * @param text 待查找文本
 */
FirstIndex(keywords, text) {
    for index, keyword in keywords {
        pos := InStr(text, keyword)
        if (pos > 0) {
            return index
        }
    }
    return -1
}

/**
 * 从指定窗口中识别文字，去除其中的空白字符
 * @param window 窗口名
 * @param {Integer} transform 
 */
FindResults(window, transform := 2) {
    result := OCR.FromWindow(window, "zh-CN", transform)
    for line in result.Lines {
        line.Text := RegExReplace(line.Text, "\s", "")
        OutputDebug "识别文本: " line.Text
        ; result.Highlight(line , -2000)
    }

    return result
}
/**
 * 从指定窗口中识别目标关键字，返回第一个 line 对象
 * @param windowName 窗口名 
 * @param targetArr 目标关键字数组
 * @param excludeArr 排除关键字数组
 * @returns {Integer | Object} 
 */
FirstResult(windowName, targetArr, excludeArr) {
    WinGetClientPos(&X, &Y, &Width, &Height, "A")
    OutputDebug "窗口宽高: " Width "*" Height
    ; 根据宽高设置初始缩放比例
    switch
    {
        case Width >= 1920: InitScale := 1
        case Width >= 1600: InitScale := 1.1
        case Width >= 1280: InitScale := 1.5
        default: InitScale := 2
    }

    ; 初始缩放比例
    transform := { scale: InitScale }
    ; 过滤行
    filterLines := []
    ; 尝试不同的缩放比例来识别
    result := 0
    While (filterLines.Length == 0 and transform.scale > 0.2)
    {
        OutputDebug "transform: " transform.scale
        result := FindResults(windowName, transform)
        for line in result.Lines {
            if (HasKeyword(targetArr, line.Text) and !HasKeyword(excludeArr, line.Text)) {
                filterLines.Push(line)
            }
        }
        transform.scale := transform.scale - 0.2
    }

    if (filterLines.Length==0) {
        return 0
    }

    target := filterLines[1]

    ; 选出位置最靠前的
    for line in filterLines {
        i1 := FirstIndex(mainButton, line.Text)
        i2 := FirstIndex(mainButton, target.Text)
        if (i1 < i2) {
            target := line
            OutputDebug line.Text "-" i1 " < " target.Text "-" i2
        }
        OutputDebug "匹配文本: " line.Text
    }
    
    return {result:result ,target:target}
}

/**
 * 鼠标点击指定位置后归位
 * @param x 
 * @param y 
 */
ClickPoint(x, y) {
    xpos := 0
    ypos := 0
    MouseGetPos &xpos, &ypos

    MouseClick , x, y
    Sleep 50

    MouseMove xpos, ypos
}